package service.version2;


import dao.version2.UserInfoDao;
import dao.version2.UserInfoHistoryDao;
import utils.version2.ConnectionUtil;


import java.sql.Connection;
import java.sql.SQLException;

public class UserService {

    /*
        必须在服务层创建Connection对象，并传递给参与事务的2个dao类。
        而且事务也必须在服务层开启，在服务层结束。

        不好的地方：
        1. 由于有commit方法的调用，不可避免的出现SQLException这种属于dao层该出现的类型。虽然你可以用Throwable伪装一下(这个问题不算严重，几乎可以忽略）
        2.还是出现了应该出现在dao层的类型，比如Connection，需要移走。

     */
    public void archive(String userid, String username) {
        Connection connection = ConnectionUtil.getConnection();

        try {
            connection.setAutoCommit(false);

            UserInfoDao needToArchive = new UserInfoDao(connection);
            UserInfoHistoryDao archivingUser = new UserInfoHistoryDao(connection);

            needToArchive.deleteById(userid);
            archivingUser.insert(userid, username);

           ConnectionUtil.commit(connection);

        } catch (Throwable e) {
            ConnectionUtil.rollback(connection);
            System.out.println(e.getMessage() + " in service");
        } finally {
            ConnectionUtil.close(connection);
        }

    }

    /*
    这个方法没有与其它dao一起参与事务，正常执行。
    但现在参与事务的业务与不参与事务的实现写法不统一，并且服务类中出现了本该dao层处理的代码，比如连接关闭。
     */
    public void deleteById(String userid) {
        Connection connection = ConnectionUtil.getConnection();

        UserInfoDao userInfoDao = new UserInfoDao(connection);
        userInfoDao.deleteById(userid);

        ConnectionUtil.close(connection);

    }
}
